package dao;

import beans.Examen;
import beans.Note;
import beans.Utilisateur;
import static dao.DAOUtilitaire.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

public class NoteDAOImpl implements NoteDAO {
        private final static String SQL_INSERT ="INSERT INTO note_examen_etudiant (examen,etudiant,note) VALUES (?,?,?)";
        private final static String SQL_SELECT_NOTES = "SELECT m.libelle_matiere, e.id_exam, e.date_examen, n.note FROM matiere m, examen e, note_examen_etudiant n, utilisateur u WHERE m.id_matiere = e.matiere AND e.id_exam = n.examen AND n.etudiant = u.id_utilisateur AND u.id_utilisateur = ?";
	private final static String SQL_SELECT_PAR_MATIERE = "SELECT m.libelle_matiere, e.libelle_examen, e.date_examen, n.note FROM matiere m, examen e, note_examen_etudiant n, utilisateur u WHERE m.id_matiere = e.matiere AND e.id_exam = n.examen AND n.etudiant = u.id_utilisateur AND u.id_utilisateur = ? AND m.id_matiere=?";
	
        
        
        
        private DAOFactory daoFactory;
    private JOptionPane jop1;

        public NoteDAOImpl(DAOFactory daoFactory){
            this.daoFactory=daoFactory;
        }
        
    @Override
    public void ajouterNote(Note note) throws DAOException {
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet valeursAutoGenerees = null;

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee( connexion, SQL_INSERT, true,note.getExamen(),note.getEtudiant(),note.getNote());
            int statut = preparedStatement.executeUpdate();
            /* Analyse du statut retourné par la requête d'insertion */
            if ( statut == 0 ) {
                throw new DAOException( "Échec de la création d'une note, aucune ligne ajoutée dans la table." );
            }
            /* Récupération de l'id auto-généré par la requête d'insertion */
            valeursAutoGenerees = preparedStatement.getGeneratedKeys();
            if ( valeursAutoGenerees.next() ) {
                /* Puis initialisation de la propriété id_note du bean note avec sa valeur */
                note.setId_note( valeursAutoGenerees.getInt( 1 ) );
            } else {
                throw new DAOException( "Échec de la création d'une note en base, aucun ID auto-généré retourné." );
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses( valeursAutoGenerees, preparedStatement, connexion );
        }
    }    
         @Override
	    public List<ArrayList> consulterNotes(Integer id_etudiant) {
	         Connection connexion = null;
	        PreparedStatement preparedStatement = null;
	        ResultSet resultSet = null;
                List<ArrayList> notes =new ArrayList<ArrayList>();
                List<String> note= null;
                String matiere;
                String examen ;
                String date;
                String noteValue;
              
                
            try {
	            /* Récupération d'une connexion depuis la Factory */
	            connexion = daoFactory.getConnection();
	            preparedStatement = initialisationRequetePreparee( connexion, SQL_SELECT_NOTES, false, id_etudiant.intValue());
	            resultSet = preparedStatement.executeQuery();
                     while ( resultSet.next() ) {
                    matiere=resultSet.getString("libelle_matiere");
                    examen=Integer.toString(resultSet.getInt("id_exam"));
                    date=resultSet.getDate("date_examen").toString();
                    noteValue=Float.toString(resultSet.getFloat("note"));
                    note=new ArrayList<String>();
                    note.add(matiere);
                    
                    note.add(examen);
                    note.add(date);
                    note.add(noteValue);
                    notes.add((ArrayList) note);
                    
                    
                }
	
	            return notes;
	
	        } catch ( SQLException e ) {
	            throw new DAOException( e );
	        } finally {
	            fermeturesSilencieuses( resultSet, preparedStatement, connexion );
	        }
            
            
	    }
	
	

        public ResultSet afficherNotesParMAtiere(Integer id_etudiant, Integer Id_matiere) {
	         Connection connexion = null;
	        PreparedStatement preparedStatement = null;
	        ResultSet resultSet = null;
	
	        try {
	            /* Récupération d'une connexion depuis la Factory */
	            connexion = daoFactory.getConnection();
	            preparedStatement = initialisationRequetePreparee( connexion, SQL_SELECT_PAR_MATIERE, true, id_etudiant, Id_matiere);
	            resultSet = preparedStatement.executeQuery();
	
	
	            return resultSet;
	
	        } catch ( SQLException e ) {
	            throw new DAOException( e );
	        } finally {
	            fermeturesSilencieuses( resultSet, preparedStatement, connexion );
	        }
	    } 
}
